package com.zwr.sheller.customer.config;


import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

@Configuration
public class RabbitConfig {
    // ------------设置前后端交互队列 ----------
    //前后端交互队列交换机
    public  static  final  String INTERACTIVE_EXCHANGE = "interactive_exchange";
    //前后端交互队列
    public  static  final  String INTERACTIVE_QUEUE = "interactive_queue";
    //交互路由key
    public static final String  INTERACTIVE_ROUTING_KEY = "interactiveKey";

    //  -----------设置订单部分的交换机/队列/路由名称-----------

    //订单交换机的名称
    public  static  final  String ORDER_EXCHANGE = "order_exchange";

    //订单队列名
    public  static  final  String ORDER_QUEUE = "order_queue";

    //订单路由key
    public static final String  ORDER_ROUTING_KEY = "orderKey";

    //-----------设置死信部分的交换机/队列/路由名称-------------

    //死信交换机名称
    public static final String DLX_EXCHANGE = "dlx_exchange";

    //死信队列
    public static final String DLX_QUEUE = "dlx_queue";
    //死信路由
    public static final String DLX_ROUTING_KEY = "dlxrRoutingKey";


    //------------------------配置前后端交互部分的交换机/队列/路由-------------
    //交互交换机
    @Bean
    public DirectExchange createInteractiveExchange(){
        return  new DirectExchange(INTERACTIVE_EXCHANGE);
    }

    //声明交互队列
    @Bean
    public Queue  createInteractiveQueue(){
        return new Queue(INTERACTIVE_QUEUE);
    }
    //绑定（交互交换机和交互队列绑定）
    @Bean
    public Binding interactiveBinding(){
        return BindingBuilder.bind(createInteractiveQueue()).to(createInteractiveExchange()).with(INTERACTIVE_ROUTING_KEY);
    }

    //------------------------配置死信部分的交换机/队列/路由-------------

    //死信交换机
    @Bean
    public DirectExchange createDlxExchange(){
        return  new DirectExchange(DLX_EXCHANGE);
    }

    //声明死信队列
    @Bean
    public Queue  createDlxQueue(){
       return new Queue(DLX_QUEUE);
    }

    /**
     *
     * *（死信交换机+死信路由->死信队列 的绑定） */
    @Bean
    public Binding dlxBinding(){
        return BindingBuilder.bind(createDlxQueue()).to(createDlxExchange()).with(DLX_ROUTING_KEY);
    }

    //------------------------配置订单部分的交换机/队列/路由--------------
    /**
     * 定义一个默认的direct类型的Exchange(交换机)
     * @ return 返回该交换机
     */
    @Bean
    public DirectExchange createOrderExchange(){
        return  new DirectExchange(ORDER_EXCHANGE);
    }

    /**
     * 声明订单队列
     */

    @Bean(ORDER_QUEUE)
    public Queue createOrderQueue(){
        // durable:是否持久化,默认是false,持久化队列：会被存储在磁盘上，当消息代理重启时仍然存在，暂存队列：当前连接有效
        // exclusive:默认也是false，只能被当前创建的连接使用，而且当连接关闭后队列即 被删除。此参考优先级高于durable
        // autoDelete:是否自动删除，当没有生产者或者消费者使用此队列，该队列会自动删除。
        //一般设置一下队列的持久化就好,其余两个就是默认false
        // return new Queue("ORDER_QUEUE",true,false,false);
        //再看参数部分: 目的是当消息队列的过期时间TTL到期,消息就会被添加到死信队列中去
        Map<String,Object> arguments = new HashMap<>(2);
        // 绑定死信交换机
        arguments.put("x-dead-letter-exchange", DLX_EXCHANGE);
        //绑定路由key
        arguments.put("x-dead-letter-routing-key", DLX_ROUTING_KEY);

        return new Queue(ORDER_QUEUE,true,false,false,arguments);
    }

    @Bean
    public Binding OrderBinding(){
        // 绑定消息通道到交换机上,并设置判断路由的key为
        return BindingBuilder.bind(createOrderQueue()).to(createOrderExchange()).with(ORDER_ROUTING_KEY);
    }
}
